home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-09-27 | 4.6 KB | 155 lines | [TEXT/CCL2] |
- ;;; This defines all core symbols.
-
- ;;; Core symbols are stored in global variables. The core-symbol
- ;;; macro just turns a string into a variable name.
-
- (define-syntax (core-symbol str)
- (make-core-symbol-name str))
-
- (define-syntax (core-symbol/di str)
- (make-core-symbol-name/di str))
-
- (define (make-core-symbol-name str)
- (string->symbol (string-append "*core-" str "*")))
-
- (define (make-core-symbol-name/di str)
- (make-core-symbol-name (add-di-prefix/string str)))
-
- (define (symbol->core-var name)
- (make-core-symbol-name (symbol->string name)))
-
- (define (symbol->core-var/di name)
- (make-core-symbol-name/di (symbol->string name)))
-
- (define (get-core-var-names vars type)
- (let ((res (assq type vars)))
- (if (eq? res '#f)
- '()
- (map (function string->symbol) (tuple-2-2 res)))))
-
- ;;; This is just used to create a define for each var without a
- ;;; value.
-
- (define-syntax (define-core-variables)
- `(begin
- ,@(define-core-variables-1 *haskell-prelude-vars*)
- ,@(define-core-variables-1 *haskell-noncore-vars*)))
-
- (define (define-core-variables-1 vars)
- (concat
- (cons
- (map (function init-core-symbol/di)
- (get-core-var-names vars 'derivings))
- (map (lambda (ty)
- (map (function init-core-symbol)
- (get-core-var-names vars ty)))
- '(classes methods types constructors synonyms values)))))
-
- (define (init-core-symbol sym)
- `(define ,(symbol->core-var sym) '()))
-
- (define (init-core-symbol/di sym)
- `(define ,(symbol->core-var/di sym) '()))
-
- (define-syntax (create-core-globals)
- `(begin
- (begin ,@(create-core-defs *haskell-prelude-vars* '#t))
- (begin ,@(create-core-defs *haskell-noncore-vars* '#f))))
-
- (define (create-core-defs defs prelude-core?)
- `(,@(map (lambda (x) (define-core-value x prelude-core?))
- (get-core-var-names defs 'values))
- ,@(map (lambda (x) (define-core-method x prelude-core?))
- (get-core-var-names defs 'methods))
- ,@(map (lambda (x) (define-core-synonym x prelude-core?))
- (get-core-var-names defs 'synonyms))
- ,@(map (lambda (x) (define-core-class x prelude-core?))
- (get-core-var-names defs 'classes))
- ,@(map (lambda (x) (define-core-type x prelude-core?))
- (get-core-var-names defs 'types))
- ,@(map (lambda (x) (define-core-constr x prelude-core?))
- (get-core-var-names defs 'constructors))
- ,@(map (lambda (x) (define-core-deriving x prelude-core?))
- (get-core-var-names defs 'derivings))))
-
- (define (define-core-value name pc?)
- `(setf ,(symbol->core-var name)
- (make-core-value-definition ',name ',pc?)))
-
- (define (make-core-value-definition name pc?)
- (install-core-sym
- (make var (name name) (module '|*Core|) (unit '|*Core|))
- name
- pc?))
-
- (define (define-core-method name pc?)
- `(setf ,(symbol->core-var name)
- (make-core-method-definition ',name ',pc?)))
-
- (define (make-core-method-definition name pc?)
- (install-core-sym
- (make method-var (name name) (module '|*Core|) (unit '|*Core|))
- name
- pc?))
-
- (define (define-core-class name pc?)
- `(setf ,(symbol->core-var name)
- (make-core-class-definition ',name ',pc?)))
-
- (define (make-core-class-definition name pc?)
- (install-core-sym
- (make class (name name) (module '|*Core|) (unit '|*Core|))
- name
- pc?))
-
- (define (define-core-synonym name pc?)
- `(setf ,(symbol->core-var name)
- (make-core-synonym-definition ',name ',pc?)))
-
- (define (make-core-synonym-definition name pc?)
- (install-core-sym
- (make synonym (name name) (module '|*Core|) (unit '|*Core|))
- name
- pc?))
-
- (define (define-core-type name pc?)
- `(setf ,(symbol->core-var name)
- (make-core-type-definition ',name ',pc?)))
-
- (define (make-core-type-definition name pc?)
- (install-core-sym
- (make algdata (name name) (module '|*Core|) (unit '|*Core|))
- name
- pc?))
-
- (define (define-core-constr name pc?)
- `(setf ,(symbol->core-var name)
- (make-core-constr-definition ',name ',pc?)))
-
- (define (make-core-constr-definition name pc?)
- (setf name (add-con-prefix/symbol name))
- (install-core-sym
- (make con (name name) (module '|*Core|) (unit '|*Core|))
- name
- pc?))
-
- (define (define-core-deriving name pc?)
- `(setf ,(symbol->core-var/di name)
- (make-core-deriving-definition ',name ',pc?)))
-
- (define (make-core-deriving-definition name pc?)
- (setf name (add-di-prefix name))
- (install-core-sym
- (make deriving (name name) (module '|*Core*|) (unit '|*Core*|))
- name
- pc?))
-
- (define (install-core-sym def name preludecore?)
- (setf (def-prelude? def) '#t)
- (when preludecore?
- (setf (def-core? def) '#t))
- (setf (table-entry (dynamic *core-symbols*) name) def)
- (when preludecore?
- (setf (table-entry (dynamic *prelude-core-symbols*) name) def))
- def)
-